package com.tianya.utils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;

public class DateUtils {

    // 默认日期时间格式
    private static final String DEFAULT_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    // 默认日期格式
    private static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";

    /**
     * 获取当前日期时间并格式化为字符串。
     *
     * @return 当前日期时间的字符串表示
     */
    public static String getCurrentDateTimeStr() {
        LocalDateTime now = LocalDateTime.now();
        return formatDateTime(now);
    }

    /**
     * 根据指定单位调整给定的日期。
     *
     * @param baseDate 要调整的基础日期
     * @param value    要调整的数量，正数表示增加，负数表示减少
     * @param unit     调整的单位，可选值："days", "months", "years"
     * @return 调整后的日期字符串
     */
    public static String adjustDate(LocalDate baseDate, int value, String unit) {
        TemporalUnit temporalUnit;

        switch (unit.toLowerCase()) {
            case "days":
                temporalUnit = ChronoUnit.DAYS;
                break;
            case "months":
                temporalUnit = ChronoUnit.MONTHS;
                break;
            case "years":
                temporalUnit = ChronoUnit.YEARS;
                break;
            default:
                throw new IllegalArgumentException("Unsupported unit: " + unit + ". Use 'days', 'months', or 'years'.");
        }

        LocalDate resultDate = baseDate.plus(value, temporalUnit);
        return resultDate.format(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN));
    }

    /**
     * 格式化LocalDateTime对象为字符串。
     *
     * @param dateTime LocalDateTime对象
     * @return 格式化后的日期时间字符串
     */
    public static String formatDateTime(LocalDateTime dateTime) {
        return dateTime.format(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN));
    }

    /**
     * 格式化LocalDate对象为字符串。
     *
     * @param date LocalDate对象
     * @return 格式化后的日期字符串
     */
    public static String formatDate(LocalDate date) {
        return date.format(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN));
    }

    /**
     * 将日期时间字符串解析为LocalDateTime对象。
     *
     * @param dateTimeStr 日期时间字符串
     * @return 解析后的LocalDateTime对象，解析失败返回null
     */
    public static LocalDateTime parseDateTime(String dateTimeStr) {
        try {
            return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN));
        } catch (DateTimeParseException e) {
            System.err.println("Error parsing date time: " + e.getMessage());
            return null;
        }
    }

    /**
     * 将日期字符串解析为LocalDate对象。
     *
     * @param dateStr 日期字符串
     * @return 解析后的LocalDate对象，解析失败返回null
     */
    public static LocalDate parseDate(String dateStr) {
        try {
            return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN));
        } catch (DateTimeParseException e) {
            System.err.println("Error parsing date: " + e.getMessage());
            return null;
        }
    }

}
